
/***********************************************************************************************************************
**                                                    Includes                                                        **
***********************************************************************************************************************/
#include "Cdd_Mcal.h"

/***********************************************************************************************************************
**                                          Global Functions Definitions                                              **
***********************************************************************************************************************/


/***********************************************************************************************************************
**                                            Private Macro Definitions                                               **
***********************************************************************************************************************/


/***********************************************************************************************************************
**                                            Private Type Definitions                                                **
***********************************************************************************************************************/


/***********************************************************************************************************************
**                                           Private Variable Definitions                                             **
***********************************************************************************************************************/
/* ADC采样滤波控制信息 */
static ADC_SAMPLE_FILTER_CTRL_INFO adcFliterCtrlInfo;

/***********************************************************************************************************************
**                                           Private Function Declarations                                            **
***********************************************************************************************************************/


/***********************************************************************************************************************
**                                            Global Function Definitions                                             **
***********************************************************************************************************************/
/**
  * @brief  ADC滤波参数初始化
  * @param  None
  * @retval None
  */
static void Cdd_AdcFilterParameterInit(void)
{
	for (ADC_SAMPLE_TYPE i=AFE1_NTC4_AD; i<ADC_SAMPLE_TYPE_MAX; i++)
	{
		adcFliterCtrlInfo.filter[i].index = 0;  
		for (uint8 j=0; j<ADC_SAMPLE_FILTER_BUFF_LENGTH; j++)
		{
			adcFliterCtrlInfo.filter[i].sampleBuff[j] = 0;
		}
		adcFliterCtrlInfo.adcFilterResult[i] = 0;
	}
	adcFliterCtrlInfo.filterInterval = 0;
}

/**
  * @brief  滤波处理
  * @param  sampleValue 实时采样值
  * @retval 滤波结果首地址
  */
static uint16 *Cdd_AdcValueFilterProcess(uint16 *sampleValue)
{
	/* 采样值总和 */
	uint32 sumValue = 0;
	/* 滤波后的结果 */
	static uint16 filterValue[ADC_SAMPLE_TYPE_MAX] = {0};
	
	for (ADC_SAMPLE_TYPE type=AFE1_NTC4_AD; type<ADC_SAMPLE_TYPE_MAX; type++)
	{
		/* 重置采样总和 */
		sumValue = 0;
		
		/* 缓冲区未满，使用已采样的点数进行滤波 */
		if (adcFliterCtrlInfo.filter[type].index < ADC_SAMPLE_FILTER_BUFF_LENGTH)
		{
			/* 将采样值放入缓冲区 */
			adcFliterCtrlInfo.filter[type].sampleBuff[adcFliterCtrlInfo.filter[type].index] = sampleValue[type];
			/* 指向下一个位置 */
			adcFliterCtrlInfo.filter[type].index++;
		}
		else
		{
			/* 移位 */
			for (uint8 i=0; i<(ADC_SAMPLE_FILTER_BUFF_LENGTH - 1); i++)
			{
				adcFliterCtrlInfo.filter[type].sampleBuff[i] = adcFliterCtrlInfo.filter[type].sampleBuff[i + 1];
			}
			/* 存储最新值至数组最后的位置 */
			adcFliterCtrlInfo.filter[type].sampleBuff[ADC_SAMPLE_FILTER_BUFF_LENGTH - 1] = sampleValue[type];  
		}
		/* 计算采样值总和 */
		for (uint8 i=0; i<adcFliterCtrlInfo.filter[type].index; i++)
		{
			sumValue += adcFliterCtrlInfo.filter[type].sampleBuff[i];
		}
		/* 计算滤波结果 */
		filterValue[type] = (sumValue / adcFliterCtrlInfo.filter[type].index);
	}
	
	return (&filterValue[0]);  
}

/**
  * @brief  ADC滤波处理
  * @param  None
  * @retval None
  */
static void Cdd_AdcFilterProcess(void)
{
	/* 指向滤波结果数组首地址 */
	uint16 *ptr = NULL;  
	
	/* 滤波周期到 - 5ms */
	if (adcFliterCtrlInfo.filterInterval == 0)
	{
        /* 滤波处理 */
        ptr = Cdd_AdcValueFilterProcess(AdcDriver_GetAdcSampleBuffAddr()); 
        /* 将滤波后的值赋值给最终结果变量 */
        for (uint8 i=0; i<ADC_SAMPLE_TYPE_MAX; i++)
        {
            adcFliterCtrlInfo.adcFilterResult[i] = ptr[i];
        }

        /* 重置滤波周期 */
        adcFliterCtrlInfo.filterInterval = ADC_SAMPLE_INTERVAL;
	}
	else
	{
		/* nop */
	}
}

/**
  * @brief  ADC滤波周期计数自减-1ms周期任务中执行
  * @param  None
  * @retval None
  */
static void Cdd_AdcSampleIntervalTimeoutSelfDec(void)
{
	if (adcFliterCtrlInfo.filterInterval > 0)
	{
		adcFliterCtrlInfo.filterInterval--;
	}
	else
	{
		/* nop */
	}
}

/***********************************************************************************************************************
**                                            Global Function Task                                                    **
***********************************************************************************************************************/
/**
  * @brief  Mcal initial
  * @retval None
  */
void Cdd_McalInit(void)
{
	/* 1. Flash接口初始化 */ 
	FlashDriver_Init();
	
	/* 2. Gpio接口初始化 */  
	GpioDriver_Init();
	
	/* 3. Adc接口初始化+ADC滤波参数初始化 */ 
	AdcDriver_Init();
    Cdd_AdcFilterParameterInit();

#ifdef IF_ENABLE_UART_FUNCTION
	/* 4. Uart接口初始化 */ 
	UartDriver_Init();
#endif

#ifdef IF_ENABLE_ICU_FUNCTION	
	/* 5. Icu接口初始化 */
	IcuDriver_Init();
#endif
    
    /* 6. CAN驱动初始化 */
    CanDriver_Init();   
      
    /* 7. I2C初始化 */
    I2C_DriverInit();
    
    /* 8. AFE初始化 */
    AFE_Init();
}

/**
  * @brief  空闲任务
  * @retval None
  */
void Cdd_Task_Idle(void)
{
    /* 1. Flash轮询任务 */
	FlashDriver_PollTask();
}

/**
  * @brief  5ms周期任务
  * @retval None
  */
void Cdd_Task_5ms(void)
{
	/* 1. Gpio轮询任务 */
	GpioDriver_PollTask();

#ifdef IF_ENABLE_UART_FUNCTION
	/* 2. 串口接收任务 */
	UartDriver_ReceiveProcess();
#endif
    
	/* 3. ADC采样周期计数自减 */
	Cdd_AdcSampleIntervalTimeoutSelfDec();
    
	/* 4. ADC滤波处理 */
	Cdd_AdcFilterProcess();
}

/**
  * @brief  10ms周期任务
  * @retval None
  */
void Cdd_Task_10ms(void)
{
#ifdef IF_ENABLE_ICU_FUNCTION	
	/* 1. PWM周期检测计数自减 */
	IcuDriver_PeriodTimeoutSelf(); 
	/* 2. PWM占空比检测计数自减 */
	IcuDriver_DutyTimeoutSelf();
	/* 3. Icu轮询任务 */
	IcuDriver_PollTask();
#endif
    AFE_MainFunc();
}

/**
  * @brief  50ms周期任务
  * @retval None
  */
void Cdd_Task_50ms(void)
{
    /* nop */
}

/**
  * @brief  100ms周期任务
  * @retval None
  */
void Cdd_Task_100ms(void)
{
#ifdef IF_ENABLE_ICU_FUNCTION	
	/* 1. Gpio输出测试-ICU使用 */
	GpioDriver_IcuTest();
	
	/* 2. Icu轮询任务 */
	IcuDriver_PollTask();
#endif
}

/***********************************************************************************************************************
**                                            Global Function Interface                                               **
***********************************************************************************************************************/

/**
  * @brief  获取ADC滤波后的结果
  * @param  type 类型，result 结果
  * @retval None
  */
void AdcDriver_GetAdcFilterResult(ADC_SAMPLE_TYPE type,uint16 *result)
{
	*result = adcFliterCtrlInfo.adcFilterResult[type];
}

/***********************************************************************************************************************
**                                                  General Notes                                                     **
***********************************************************************************************************************/

